package com.huluobo.a2308douyindemo.login

import android.content.Intent
import android.graphics.Color
import android.text.Spannable
import android.text.SpannableStringBuilder
import android.text.style.ForegroundColorSpan
import android.util.Log
import android.widget.Toast
import com.google.gson.Gson
import com.huluobo.a2308douyindemo.MainActivity
import com.huluobo.a2308douyindemo.bean.UserBean
import com.huluobo.a2308douyindemo.databinding.ActivityLoginBinding
import com.huluobo.a2308douyindemo.mvvm.BaseActivity
import com.huluobo.a2308douyindemo.net.Const
import com.huluobo.a2308douyindemo.net.MessageEvent
import com.huluobo.a2308douyindemo.register.RegisterActivity
import com.huluobo.a2308douyindemo.utils.MySp
import com.huluobo.a2308douyindemo.utils.MyToast
import com.huluobo.a2308douyindemo.utils.Utils.isValidPassword
import com.huluobo.a2308douyindemo.utils.Utils.isValidPhone
import com.hyphenate.EMCallBack
import com.hyphenate.chat.EMClient
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking

/**
 * hiltMVVM框架网络请求总结:
 * 1.ViewModel上需要加上@HiltViewModel注解
 * 2.Activity上需要加上AndroidEntryPoint注解
 * 3.App上需要加上HiltAndroidApp注解
 * 4.清单文件中需要加上允许使用明文的选项为true
 */
@AndroidEntryPoint
class LoginActivity : BaseActivity<ActivityLoginBinding, LoginViewModel>() {

    //是否记住密码,默认为false
    private var rememberPassword = false

    override fun initData() {
        //登录成功
        vm.loginSuccess.observe(this) {
            //登录I视频服务器成功的同时,登录环信服务器
            EMClient.getInstance().login(it.data.username, it.data.password, object : EMCallBack {
                override fun onSuccess() {
                    //环信中所有的回调都处于子线程的位置,通过线程的方式切换到主线程
//                    runOnUiThread {
//
//                    }

                    //通过协程的方式切换到主线程
                    runBlocking(Dispatchers.Main) {
                        MyToast.showLong("欢迎回来:${it.data.username}")
                        MySp.putString(Const.PARAM_TOKEN, it.data.token)
                        MySp.putInt(Const.PARAM_USER_ID, it.data.id)
                        if (it.data.headImg != null) {
                            MySp.putString(Const.KEY_USER_ICON, it.data.headImg)
                        }

                        //登录成功查询用户账户
                        vm.getAccount(it.data.id)

                        //登录7012服务器
                        val map = mapOf(
                            Const.PARAM_USERNAME to it.data.username,
                            Const.PARAM_PASSWORD to it.data.password
                        )
                        vm.login7012(map)

                        //是否记住密码的情况
                        if (rememberPassword) {
                            //记住密码
                            MySp.putString(Const.PARAM_USERNAME, it.data.username)
                            MySp.putString(Const.PARAM_PASSWORD, it.data.password)
                        } else {
                            //不记住密码
                            MySp.remove(Const.PARAM_USERNAME)
                            MySp.remove(Const.PARAM_PASSWORD)
                        }

                        startAct(MainActivity::class.java)
                        finish()
                    }
                }

                override fun onError(code: Int, error: String?) {
                    Log.e("TagA", "登录失败:$code ,error:$error")
                }
            })
        }

        vm.getAccountSuccess.observe(this) {
            val accountJson = Gson().toJson(it.data)
            MySp.putString(Const.KEY_ACCOUNT, accountJson)
        }

        vm.login7012Success.observe(this) {
            MySp.putString(Const.PARAM_TOKEN_7012, it.data.token)
        }
    }

    override fun initView() {

        if (MySp.get(Const.PARAM_USERNAME).isNotEmpty() && MySp.get(Const.PARAM_PASSWORD).isNotEmpty()
        ) {
            binding.loginUsernameEt.text.insert(0, MySp.get(Const.PARAM_USERNAME))
            binding.loginPasswordEt.text.insert(0, MySp.get(Const.PARAM_PASSWORD))
            binding.loginRememberCb.isChecked = true
            rememberPassword = true
        }
        binding.loginContractCb.isChecked = MySp.getBoolean(Const.KEY_AGREE_CONTRACT)

        binding.loginBtn.setOnClickListener {
            val username = binding.loginUsernameEt.text.toString()
            val password = binding.loginPasswordEt.text.toString()

            if (username.isNotEmpty()) {
                if (password.isNotEmpty()) {
                    if (username.isValidPhone()) {
                        if (password.isValidPassword()) {
                            //触发登录
                            vm.login(username, password)
                        } else {
                            binding.loginPasswordEt.error = "密码必须为6-20位的数字"
                        }
                    } else {
                        binding.loginUsernameEt.error = "用户名必须为手机号"
                    }
                } else {
                    binding.loginPasswordEt.error = "密码不能为空"
                }
            } else {
                binding.loginUsernameEt.error = "用户名不能为空"
            }
        }

        binding.loginToRegister.setOnClickListener {
            startActivity(Intent(this, RegisterActivity::class.java))
        }

        //记住密码的赋值情况
        binding.loginRememberCb.setOnCheckedChangeListener { _, isChecked ->
            rememberPassword = isChecked
        }

        //用户协议部分
        //富文本的本质就是html中的span标签,通过span来包裹字符串的某一部分来实现修改部分颜色
        val contractString = "同意《用户协议》"
//        < span color = "red" > 同意 < / span >

        //创建富文本编辑器
        val spanBuilder = SpannableStringBuilder(contractString)

        //声明前景(蒙层)颜色
        val blue = ForegroundColorSpan(Color.RED)
        //设置富文本范围 1.颜色 2.标记起始位置 3.标记结束位置 4.标记(包含或者不包含)
        spanBuilder.setSpan(blue, 2, contractString.length, Spannable.SPAN_INCLUSIVE_INCLUSIVE)
        binding.loginContractTv.text = spanBuilder

        binding.loginContractTv.setOnClickListener {
//            AlertDialog.Builder(this)
//                .setTitle("用户协议")
//                .setMessage("用户协议用户协议用户协议用户协议用户协议用户协议用户协议用户协议用户协议用户协议用户协议用户协议用户协议")
//                .setPositiveButton("确认") { dialog, _ ->
//                    binding.loginContractCb.isChecked = true
//                    dialog.dismiss()
//                }
//                .setNegativeButton(
//                    "取消"
//                ) { dialog, _ -> dialog.dismiss() }
//                .show()

            startAct(ContractActivity::class.java)
        }

        binding.loginContractCb.setOnCheckedChangeListener { _, isChecked ->
            if (isChecked) {
//                SPUtils.getInstance().put(Const.KEY_AGREE_CONTRACT, true)
                MySp.putBoolean(Const.KEY_AGREE_CONTRACT, true)
            }
        }
    }

    //使用eventBus第二步,声明一个方法,用于接受传递的类
    //需要添加注解,EventBus本身同样是个观察者模式
    override fun onEvent(messageEvent: MessageEvent) {
        if (messageEvent.message == "同意") {
            binding.loginContractCb.isChecked = true
            MySp.putBoolean(Const.KEY_AGREE_CONTRACT, true)

        } else {
            val userBean = Gson().fromJson(messageEvent.message, UserBean::class.java)
            binding.loginUsernameEt.text.clear()
            binding.loginPasswordEt.text.clear()
            binding.loginUsernameEt.text.insert(0, userBean.username)
            binding.loginPasswordEt.text.insert(0, userBean.password)
        }
    }

    override fun onError(t: Throwable) {
        super.onError(t)
        startAct(RegisterActivity::class.java)
    }
}